home *** CD-ROM | disk | FTP | other *** search
Text File | 1989-10-15 | 6.1 KB | 265 lines | [TEXT/PJMM] |
- UNIT MyDialogs;
- {***********************************}
- INTERFACE
-
- USES
- MemTypes, QuickDraw, OSIntf, ToolIntf, PackIntf, MacPrint, ObjIntf, GlobalStuff;
-
- TYPE
- TDialog = OBJECT(TObject)
- fDlogItems: Integer;
- fDFlag: BOOLEAN;
- fPopMenus: Integer;
- fPopUpID: Integer;
- fPopItem: Integer;
- fStr: ARRAY[1..kMaxEditItems] OF Str255;
- PROCEDURE Init (vDlogItems, vPopMenus, vPopUpID: Integer;
- vDFlag: BOOLEAN);
- PROCEDURE DoDialog (vDialogID: Integer);
- END;
-
- {***********************************}
- IMPLEMENTATION
-
- CONST
- cPromptItem = 3;
- cPopUpItem = 4;
- cFirstEditItem = 5;
-
- VAR
- uItemType: Integer;
- uItemHdl: Handle;
- uItemRect: Rect;
- uPopUpRect: Rect;
- uPromptRect: Rect;
- uPopUpID: Integer;
- uPopMenuHdl: MenuHandle;
- uMarkedItem: Integer;
-
- {========================================}
- PROCEDURE TDialog.Init (vDlogItems, vPopMenus, vPopUpID: Integer;
- vDFlag: BOOLEAN);
- BEGIN
- fDlogItems := vDlogItems;
- fPopMenus := vPopMenus;
- fPopUpID := vPopUpID;
- fPopItem := 1;
- fDFlag := vDFlag;
- END; {Init}
-
- {========================================}
- PROCEDURE OutlineOK (vDPtr: DialogPtr);
- VAR
- vSavePort: GrafPtr;
-
- BEGIN
- GetPort(vSavePort);
- SetPort(vDPtr);
- GetDItem(vDPtr, OK, uItemType, uItemHdl, uItemRect);
- IF uItemHdl <> NIL THEN
- BEGIN
- PenSize(3, 3);
- InsetRect(uItemRect, -4, -4);
- FrameRoundRect(uItemRect, 16, 16);
- PenSize(1, 1);
- END;
- SetPort(vSavePort);
- END; {OutlineOK}
-
- {- - - - - - - - - - - - - - - - - - -}
- PROCEDURE DrawPopUp (vDPtr: DialogPtr;
- vItem: Integer);
- CONST
- cLeftSlop = 5;
- cRightSlop = 3;
- cBotSlop = 7;
-
- VAR
- vRect: Rect;
- vItemText: Str255;
- vWidth, vNewWidth, vNewLength: Integer;
-
- BEGIN
- GetItem(uPopMenuHdl, uMarkedItem, vItemText);
- vRect := uPopUpRect;
- WITH vRect DO
- BEGIN
- InsetRect(vRect, -1, -1);
- vWidth := (right - left) - (cLeftSlop + cRightSlop);
- vNewWidth := StringWidth(vItemText);
- IF vNewWidth > vWidth THEN
- BEGIN
- vNewLength := LENGTH(vItemText);
- vWidth := vWidth - CharWidth('…');
-
- REPEAT
- vNewWidth := vNewWidth - CharWidth(vItemText[vNewLength]);
- Delete(vItemText, vNewLength, 1);
- vNewLength := PRED(vNewLength);
- UNTIL (vNewWidth <= vWidth) OR (LENGTH(vItemText) = 0);
-
- vNewLength := SUCC(vNewLength);
- Insert('…', vItemText, vNewLength);
- END;
-
- FrameRect(vRect);
- MoveTo(right, top + 2);
- LineTo(right, bottom);
- LineTo(left + 2, bottom);
-
- MoveTo(left + cLeftSlop, bottom - cBotSlop);
- DrawString(vItemText);
- END;
- END; {DrawPopUp}
-
- {- - - - - - - - - - - - - - - - - - -}
- FUNCTION MyFilter (vDPtr: DialogPtr;
- VAR vEvent: EventRecord;
- VAR vItemHit: Integer): BOOLEAN;
- VAR
- vSavePort: GrafPtr;
- vMousePt, vPopLoc: Point;
- vNewItem: Integer;
- vResult: LongInt;
-
- BEGIN
- vItemHit := 0;
- MyFilter := FALSE;
- GetPort(vSavePort);
- SetPort(vDPtr);
-
- CASE vEvent.what OF
- keyDown:
- BEGIN
- IF (vEvent.message MOD 256) IN [kCR, kEnter] THEN
- BEGIN
- GetDItem(vDPtr, OK, uItemType, uItemHdl, uItemRect);
- HiliteControl(ControlHandle(uItemHdl), 1);
- Delay(3, vResult);
-
- MyFilter := TRUE;
- vItemHit := OK;
- END;
- END;
-
- mouseDown:
- BEGIN
- vMousePt := vEvent.where;
- GlobalToLocal(vMousePt);
-
- IF (FindDItem(vDPtr, vMousePt) + 1) = cPopUpItem THEN
- BEGIN
- InvertRect(uPromptRect);
- InsertMenu(uPopMenuHdl, -1);
- vPopLoc := uPopUpRect.topLeft;
- LocalToGlobal(vPopLoc);
- CalcMenuSize(uPopMenuHdl);
- WITH vPopLoc DO
- vResult := PopUpMenuSelect(uPopMenuHdl, v, h, uMarkedItem);
- InvertRect(uPromptRect);
- DeleteMenu(uPopUpID);
- IF vResult <> 0 THEN
- BEGIN
- vNewItem := LoWord(vResult);
-
- IF vNewItem <> uMarkedItem THEN
- BEGIN
- SetItemMark(uPopMenuHdl, uMarkedItem, ' ');
- SetItemMark(uPopMenuHdl, vNewItem, CHR(checkMark));
- uMarkedItem := vNewItem;
- EraseRect(uPopUpRect);
- DrawPopUp(vDPtr, cPopUpItem);
-
- MyFilter := TRUE;
- vItemHit := cPopUpItem;
- END;
- END;
- END;
- END;
- OTHERWISE
- END;
- SetPort(vSavePort);
- END; {MyFilter}
-
- {- - - - - - - - - - - - - - - - - - -}
- PROCEDURE TDialog.DoDialog (vDialogID: Integer);
- VAR
- vDPtr: DialogPtr;
- vItem, vItemNum: Integer;
- vStr: Str255;
-
- BEGIN
- CenterMyDialog('DLOG', vDialogID);
- vDPtr := GetNewDialog(vDialogID, NIL, POINTER(-1));
- IF vDPtr = NIL THEN
- Exit(DoDialog);
-
- IF fDFlag THEN
- FOR vItem := 1 TO fDlogItems DO
- BEGIN
- vItemNum := vItem + cFirstEditItem - 1;
- GetDItem(vDPtr, vItemNum, uItemType, uItemHdl, uItemRect);
- SetIText(uItemHdl, fStr[vItem]);
- END;
-
- OutlineOK(vDPtr);
- GetDItem(vDPtr, cFirstEditItem, uItemType, uItemHdl, uItemRect);
- SelIText(vDPtr, cFirstEditItem, 0, maxInt);
-
- CASE fPopMenus OF
- 0:
- REPEAT
- ModalDialog(NIL, vItemNum)
- UNTIL (vItemNum IN [OK, Cancel]);
- 1:
- BEGIN
- uPopUpID := fPopUpID;
- uPopMenuHdl := GetMenu(fPopUpID);
- SetItemMark(uPopMenuHdl, fPopItem, CHR(checkMark));
- uMarkedItem := fPopItem;
-
- GetDItem(vDPtr, cPopUpItem, uItemType, uItemHdl, uPopUpRect);
- SetDItem(vDPtr, cPopUpItem, uItemType, @DrawPopUp, uPopUpRect);
- GetDItem(vDPtr, cPromptItem, uItemType, uItemHdl, uPromptRect);
-
- REPEAT
- ModalDialog(@MyFilter, vItemNum);
- CASE vItemNum OF
- cPopUpItem:
- BEGIN
- fPopItem := uMarkedItem;
- END;
- OTHERWISE
- END;
- UNTIL (vItemNum IN [OK, Cancel]);
-
- ReleaseResource(Handle(uPopMenuHdl));
- END;
- OTHERWISE
- END;
-
- CASE vItemNum OF
- OK:
- BEGIN
- FOR vItem := 1 TO fDlogItems DO
- BEGIN
- vItemNum := vItem + cFirstEditItem - 1;
- GetDItem(vDPtr, vItemNum, uItemType, uItemHdl, uItemRect);
- GetIText(uItemHdl, vStr);
- fStr[vItem] := vStr;
- END;
- fDFlag := TRUE;
- END;
- Cancel:
- BEGIN
- fPopItem := 1;
- fDFlag := FALSE;
- END;
- OTHERWISE
- END;
-
- DisposDialog(vDPtr);
- END; {DoDialog}
-
- END. {unit MyDialogs}
- {***********************************}